S.O.L.I.D 設計原則(一) 內聚力&耦合力


Posted by JoJo on 2023-05-18

了解設計原則主要可以帶來兩個好處

可以寫出比較好的程式碼
能夠判斷程式碼的好壞

SOLID 簡介

SOLID設計原則的好處

  • 降低程式碼複雜程度
  • 增加程式碼的可讀性
  • 提升模組的可重複利用性
  • 讓模組具有相對高內聚力、低耦合力
  • 面臨變更需求時可減少破壞現有模組的風險

SOLID 五大原則:

  • 單一責任原則 SRP - Single Responsibility Principle
  • 開放封閉原則 OCP - Open Closed Principle
  • 里氏替換原則 LSP - Liskov Substitution Principle
  • 介面隔離原則 ISP - Interface Segregation Principle
  • 相依反轉原則 DIP - Dependency Inversion Principle

在談 SOLID 五大原則之前,先來談談「內聚力 Cohesion」跟「耦合力 Coupling」,首先我們先定義接下來討論的內聚力跟耦合力都是針對「模組 Module」來討論。

何謂模組 Module?

  • 可能是一個 Class
  • 可能是一個 Method
  • 可能是一個 Assembly

內聚力 Cohesion

在一個「模組內」完成「一件工作」的一種度量指標
要盡量設計「高內聚力」的程式碼

高內聚力

在一個「模組 Module」內只完成一項工作
內聚力高,代表該模組可以獨立運作的能力高,也就代表更容易重複利用

ex.一個 method 只負責一件事情像是寄email、驗證傳入的值是否有效

低內聚力

在一個「模組 Module」內完成多項工作
內聚力低,代表該模組做太多工作,會造成難以維護、測試、重用、理解

ex.所有功能寫在一個 class 裡或是一個 method 有 5000 行程式碼

內聚力最佳實務

實現「SRP」就是實現「提高內聚力」的一種表現

設計模組的時候要盡量設計「高內聚力」的程式碼
若要在一個模組內完成多項工作,建議拆成數個不同的類別

耦合力 Coupling

模組與模組之間的關聯強度
模組之間相互依賴的程度
在 Class B裡面直接建立了 Class A的物件實體就會建立 Class A 和 Class B 的耦合關係
要盡量設計「低耦合力」的程式碼

高耦合力

以上面的例子來說,高耦合力代表改了 Class A 的時候,相關聯的 Class B 就容易受影響 (改A壞B)

低耦合力

修改模組的時候,有越少的模組被影響就代表其耦合力越低

耦合力最佳實務

實現「DIP」就是實現「降低耦合力」的一種表現

設計模組的時候要盡量設計「低耦合力」的程式碼

總結

最理想狀況下應該要設計出「高內聚力」&「低耦合力」的程式碼,但這兩件事情其實是互斥的,怎麼說呢?

高內聚力,意味者我一次只做一件事情,但現實中系統是很複雜的,這時候就會建立很多 Class ,而 Class 多就意味者耦合力高,因為你需要呼叫各種不同的 Class ,彼此之間的耦合就變高了。

低耦合力,意味者我不跟其他模組有關聯,這在複雜的系統中就代表著你一隻 Class 做所有事情,這時候內聚力就低了。

所以在實務中,我們需要一些原則來達成內聚力和耦合力的平衡,而接下來要討論的 SOLID 設計原則就是為了解決這件事情。


#SOLID #CleanCode #CleanArchitecture #C#







Related Posts

專題研討心得:Our brawling love for information technologies in the context of XAI(臺大資管系 畢南怡 助理教授)

專題研討心得:Our brawling love for information technologies in the context of XAI(臺大資管系 畢南怡 助理教授)

where 泛型類型條件約束

where 泛型類型條件約束

LeetCode JS Easy 2704. To Be Or Not To Be

LeetCode JS Easy 2704. To Be Or Not To Be


Comments